import { getWecomConfig, getJsTicket } from '@/api/system/index'

const JSApiList = [
  'selectExternalContact',
  'openEnterpriseChat',
  'getCurExternalContact',
  'selectExternalContact',
  'navigateToAddCustomer',
  'shareToExternalContact',
  'sendChatMessage',
  'shareAppMessage',
  'getContext',
  'launchMiniprogram',
  'onMenuShareAppMessage'
]

export const wecomConfig = async function (url) {
  try {
    if (import.meta.env.VITE_APP_ENV !== 'LOC') {
      // 注册企业微信
      await wxConfig(document.location.href.split('#')[0])
      await wxAppConfig(document.location.href.split('#')[0])
    }
  } catch (e) {
    console.log(e, '---------------------')
  }
  return true
}

const checkInvoke = async () => {
  if (wx.invoke instanceof Function) {
    return true
  } else {
    await wecomConfig()
  }
}

const wxConfig = async function (url) {
  const res = await getWecomConfig({ url, type: 'co' })
  return new Promise(function (resolve) {
    if (res.success) {
      // 配置微信功能
      wx.config({
        beta: true, // 必须这么写，否则wx.invoke调用形式的jsapi会有问题
        debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来，若要查看传入的参数，可以在pc端打开，参数信息会通过log打出，仅在pc端时才会打印。
        appId: res.data.corpId, // 必填，企业微信的corpID
        timestamp: res.data.timestamp, // 必填，生成签名的时间戳
        nonceStr: res.data.nonceStr, // 必填，生成签名的随机串
        signature: res.data.signature, // 必填，签名，见 附录-JS-SDK使用权限签名算法
        jsApiList: JSApiList // 必填，需要使用的JS接口列表，凡是要调用的接口都需要传进来
      })
      wx.ready(function () {
        console.log('-----wx.config.ready--------')
        // eslint-disable-next-line
        resolve()
        // config信息验证后会执行ready方法，所有接口调用都必须在config接口获得结果之后，config是一个客户端的异步操作，所以如果需要在页面加载时就调用相关接口，则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口，则可以直接调用，不需要放在ready函数中。
      })
      wx.error(function (res) {
        console.log('wx.error', res, '-------------------------------------')
      })
    } else {
      //
    }
  })
}

const wxAppConfig = async function (url) {
  const res = await getWecomConfig({ url, type: 'app' })
  return new Promise(function (resolve) {
    // 配置微信功能
    wx.agentConfig({
      beta: true, // 必须这么写，否则wx.invoke调用形式的jsapi会有问题
      debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来，若要查看传入的参数，可以在pc端打开，参数信息会通过log打出，仅在pc端时才会打印。
      corpid: res.data.corpId, // 必填，企业微信的corpID
      agentid: res.data.agentId, // 必填，企业微信的应用id （e.g. 1000247）
      timestamp: res.data.timestamp, // 必填，生成签名的时间戳
      nonceStr: res.data.nonceStr, // 必填，生成签名的随机串
      signature: res.data.signature, // 必填，签名，见 附录-JS-SDK使用权限签名算法
      jsApiList: JSApiList, // 必填，需要使用的JS接口列表，凡是要调用的接口都需要传进来
      success: function (res) {
        // 回调
        console.log(res, '调了微信授权')
        resolve()
      },
      fail: function (res) {
        console.log(res, '调了微信授权失败')
        if (res.errMsg.indexOf('function not exist') > -1) {
          alert('版本过低请升级')
        }
      }
    })
  })
}

// 打开企业微信
export const wxSelectExternal = async function () {
  await checkInvoke()
  return new Promise(function (resolve) {
    wx.invoke(
      'selectExternalContact',
      {
        filterType: 0 // 0表示展示全部外部联系人列表，1表示仅展示未曾选择过的外部联系人。默认值为0；除了0与1，其他值非法。在企业微信2.4.22及以后版本支持该参数
      },
      function (res) {
        if (res.err_msg === 'selectExternalContact:ok') {
          // userIds  = res.userIds ; //返回此次选择的外部联系人userId列表，数组类型
          // eslint-disable-next-line
          resolve(res.userIds.join(';'))
        } else {
          console.log('selectExternalContact err')
        }
      }
    )
  })
}
// 聊天功能
export const wxDoChat = async function (userids, externalUserid, name, chatId) {
  await checkInvoke()
  wx.openEnterpriseChat({
    // 注意：userIds和externalUserIds至少选填一个。内部群最多2000人；外部群最多500人；如果有微信联系人，最多40人
    userIds: userids, //参与会话的企业成员列表，格式为userid1;userid2;...，用分号隔开。
    externalUserIds: externalUserid, // 参与会话的外部联系人列表，格式为userId1;userId2;…，用分号隔开。
    groupName: name, // 会话名称。单聊时该参数传入空字符串""即可。
    chatId: chatId, // 若要打开已有会话，需指定此参数。如果是新建会话，chatId必须为空串
    success: function (res) {
      //  var chatId = res.chatId; //返回当前群聊ID，仅当使用agentConfig注入该接口权限时才返回chatId
      // 回调
      console.log(res, 'openEnterpriseChat------------------------')
    },
    fail: function (res) {
      if (res.errMsg.indexOf('function not exist') > -1) {
        alert('版本过低请升级')
      }
    }
  })
}
// 扫一扫
export const wxScanQRCode = async function () {
  await checkInvoke()
  return new Promise(function (resolve) {
    wx.scanQRCode({
      desc: 'scanQRCode desc',
      needResult: 1, // 默认为0，扫描结果由企业微信处理，1则直接返回扫描结果，
      scanType: ['qrCode', 'barCode'], // 可以指定扫二维码还是条形码（一维码），默认二者都有
      success: function (res) {
        // 回调
        console.log(res.resultStr, '扫一扫回调')
        resolve(res.resultStr)
      },
      error: function (res) {
        if (res.errMsg.indexOf('function_not_exist') > 0) {
          alert('版本过低请升级')
        }
      }
    })
  })
}

// 获取地理位置接口
export const wxOpenLocation = async function () {
  await checkInvoke()
  return new Promise(function (resolve) {
    wx.getLocation({
      type: 'gcj02', // 默认为wgs84的gps坐标，如果要返回直接给openLocation用的火星坐标，可传入'gcj02'
      success: function (res) {
        resolve({
          success: true,
          data: res
        })
      },
      fail: function () {
        resolve({
          success: false
        })
      }
    })
  })
}

// 打开持续定位功能
export const wxOpenLongPosition = async function () {
  await checkInvoke()
  return new Promise(function (resolve, reject) {
    wx.invoke(
      'startAutoLBS',
      {
        type: 'gcj02' // wgs84是gps坐标，gcj02是火星坐标
      },
      function (res) {
        if (res.err_msg === 'startAutoLBS:ok') {
          resolve(true)
        } else {
          // eslint-disable-next-line
          reject(false)
        }
      }
    )
  })
}

// 关闭持续定位功能
export const wxCloseLongPosition = async function () {
  await checkInvoke()
  return new Promise(function (resolve, reject) {
    wx.invoke('stopAutoLBS', {}, function (res) {
      if (res.err_msg === 'stopAutoLBS:ok') {
        resolve(true)
      } else {
        // eslint-disable-next-line
        reject(false)
      }
    })
  })
}

// 启动持续获取定位
export const wxOnLocationChange = async function (lineArr) {
  await checkInvoke()
  wx.onLocationChange(function (res) {
    console.log(res)
    if (res.errMsg === 'auto:location:report:location:report:ok') {
      /* const latitude = res.latitude // 纬度，浮点数，范围为90 ~ -90
        const longitude = res.longitude // 经度，浮点数，范围为180 ~ -180。
        const speed = res.speed // 速度，以米/每秒计
        const accuracy = res.accurac // 位置精度
        const lbsIndex = 0 */
      console.log(res.longitude, res.latitude)
      lineArr.push({
        ...res,
        posStatus: 1
      })
    } else {
    }
  })
}

// 获取externalUserid
export const getCurExternalContact = async function () {
  await checkInvoke()
  return new Promise((resolve, reject) => {
    wx.invoke('getCurExternalContact', {}, (res) => {
      if (res.err_msg == 'getCurExternalContact:ok') {
        //返回当前外部联系人userId
        resolve(res.userId)
      } else {
        //错误处理
        reject(new Error(res.err_msg))
      }
    })
  })
}

// 去添加好友界面
export const wxNavigateToAddCustomer = async function () {
  await checkInvoke()
  wx.invoke('navigateToAddCustomer')
}
// 发送消息到当前会话
// https://work.weixin.qq.com/api/doc/90000/90136/94349
export async function shareToExternalContact(config = {}) {
  await checkInvoke()
  return new Promise((resolve, reject) => {
    wx.invoke('shareToExternalContact', config, (res) => {
      if (res.err_msg == 'shareToExternalContact:ok') {
        resolve()
      } else {
        reject(new Error(res.err_msg))
      }
    })
  })
}

// 聊天功能
export const wxSendChatMessage = async function (content) {
  await checkInvoke()
  return new Promise((resolve, reject) => {
    wx.invoke('sendChatMessage', content, function (res) {
      if (res.err_msg == 'sendChatMessage:ok') {
        //发送成功
        console.log('sendChatMessage', '-----------------true')
        resolve(true)
      } else {
        console.log('sendChatMessage', '-----------------false')
        resolve(false)
      }
    })
  })
}

// 自定义转发到会话
export const wxShareAppMessage = async function (content) {
  await checkInvoke()
  return new Promise((resolve, reject) => {
    wx.invoke('shareAppMessage', content, function (res) {
      if (res.err_msg == 'shareAppMessage:ok') {
        console.log('shareAppMessage', '-----------------true')
        resolve(true)
        //发送成功
      } else {
        console.log('shareAppMessage', '-----------------false')
        resolve(false)
      }
    })
  })
}

// 获取当前进入页面方式
export const getContext = async function () {
  await checkInvoke()
  return new Promise((resolve) => {
    wx.invoke('getContext', {}, function (res) {
      if (res.err_msg == 'getContext:ok') {
        resolve(res)
        // entry  = res.entry ; //返回进入H5页面的入口类型，目前有normal、contact_profile、single_chat_tools、group_chat_tools、chat_attachment
        // shareTicket = res.shareTicket; //可用于调用getShareInfo接口
      } else {
        //错误处理
        resolve({ entry: 'fail' })
      }
    })
  })
}

// 打开小程序
export const Jump2App = async function (appInfo) {
  await checkInvoke()
  wx.invoke('launchMiniprogram', appInfo, function (res) {
    if (res.err_msg == 'launchMiniprogram:ok') {
      // 正常
    } else {
      // 错误处理
    }
  })
}

// 配置右上角分享
export const onMenuShareAppMessage = async function (content) {
  await checkInvoke()
  return new Promise((resolve) => {
    wx.onMenuShareAppMessage({
      ...content,
      enableIdTrans: 1, // 是否开启id转译，不填默认为0
      success: function () {
        //发送成功
        console.log('onMenuShareAppMessage', '-----------------true')
        resolve(true)
      },
      error: function (res) {
        //发送成功
        console.log('onMenuShareAppMessage', '-----------------false')
        resolve(true)
      },
      cancel: function () {
        // 用户取消分享后执行的回调函数
      }
    })
  })
}
